import { request, useUserStore, clearEmpty } from "jmash-core";
import type { AxiosPromise } from "axios";
import type {
  ModuleReq,
  ModuleApi,
  ModulePage,
  ModuleUpdateReq,
  ModuleModel,
  ModuleCreateReq,
  ModuleKeyList,
  ModuleKey,
  ModuleMoveKey,
} from "./types";
class ModuleApiImpl implements ModuleApi {
  getKey(model: ModuleModel): ModuleKey {
    return {
      moduleId: model.moduleId,
    } as ModuleKey;
  }

  /**
   * 获取页面
   *
   * @param queryParams 查询参数
   * @returns 返回请求结果
   */
  findPage(query: ModuleReq): AxiosPromise<ModulePage> {
    query.tenant = useUserStore().user.tenant;
    clearEmpty(query);
    return request({
      url: "/v1/rbac/module/page",
      method: "get",
      params: query,
    });
  }

  // 查询系统模块
  findById(query: ModuleKey): AxiosPromise<ModuleModel> {
    query.tenant = useUserStore().user.tenant;
    clearEmpty(query);
    return request({
      url: "/v1/rbac/module/id",
      method: "get",
      params: query,
    });
  }

  /**
   * 添加模块
   *
   * @param data 模块数据
   * @returns 返回请求结果
   */
  create(data: ModuleCreateReq): AxiosPromise<ModuleModel> {
    data.tenant = useUserStore().user.tenant;
    clearEmpty(data);
    return request({
      url: "/v1/rbac/module",
      method: "post",
      data: data,
    });
  }

  /**
   * 编辑模块
   *
   * @param data 模块数据
   * @returns 返回请求结果
   */
  update(data: ModuleUpdateReq): AxiosPromise<ModuleModel> {
    data.tenant = useUserStore().user.tenant;
    clearEmpty(data);
    return request({
      url: "/v1/rbac/module",
      method: "patch",
      data: data,
    });
  }

  /**
   * 批量删除模块
   *
   * @param ids 模块ID数组
   * @returns 返回请求结果
   */
  batchDelete(keys: ModuleKey[]): AxiosPromise<number> {
    const ids = keys.map((item) => item.moduleId);
    const data: ModuleKeyList = {
      tenant: useUserStore().user.tenant,
      moduleId: ids,
    } as ModuleKeyList;
    clearEmpty(data);
    return request({
      url: "/v1/rbac/module/batch",
      method: "put",
      data: data,
    });
  }

  /**
   * 删除模块
   *
   * @param moduleId 模块ID
   * @returns 返回请求结果
   */
  delete(query: ModuleKey): AxiosPromise<ModuleModel> {
    query.tenant = useUserStore().user.tenant;
    clearEmpty(query);
    return request({
      url: "/v1/rbac/module/id",
      method: "delete",
      params: query,
    });
  }

  /**
   * 向上/下移动模块
   *
   * @param roleId 模块ID
   * @returns 返回Promise对象，表示异步操作的结果
   */
  move(key: ModuleKey, up: boolean): AxiosPromise<boolean> {
    const data: ModuleMoveKey = { ...key };
    data.tenant = useUserStore().user.tenant;
    data.up = up;
    clearEmpty(data);
    return request({
      url: "/v1/rbac/module/move",
      method: "put",
      data: data,
    });
  }

  /**
   * 获取模块列表
   *
   * @returns 返回请求结果
   */
  moduleList(): AxiosPromise {
    return request({
      url: "/v1/rbac/module/list?tenant=" + useUserStore().user.tenant,
      method: "get",
    });
  }

  checkModuleApi(moduleCode: string): AxiosPromise {
    return request({
      url: "/v1/rbac/module/check",
      method: "get",
      params: {
        tenant: useUserStore().user.tenant,
        moduleCode: moduleCode,
      },
    });
  }
}
const moduleApi = new ModuleApiImpl();
export { moduleApi };
